package ru.vsu.service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import ru.vsu.domain.SystemUser;
import ru.vsu.utils.PasswordHasher;

/**
 *  Сервис работы с юзерами.
 *
 * @author Roman Velichkin <vrnroman@gmail.com>
 */
@Stateless
public class UserService implements Serializable{


    @PersistenceContext(unitName="JavaForVSUPU")
    private EntityManager em;

    /**
     * Создание пользователя.
     * @param user
     * @return
     */
    public List<String> createNewUser(String userName, String password) {
        if (isUserExist(userName)) {
            List<String> result = new ArrayList<String>();
            result.add("Пользователь с таким именем уже существует");
            return result;
        }
        SystemUser user = new SystemUser();
        user.setName(userName);
        user.setPassword(password);
        em.persist(user);
        return null;
    }


    /**
     * Проверить, зарегистрирован ли пользователь с именем-параметром.
     * @param user
     * @return
     */
    private boolean isUserExist(String userName) {
//        CriteriaBuilder cb = em.getCriteriaBuilder();
//        CriteriaQuery<SystemUser> cq = cb.createQuery(SystemUser.class);
//        Root<SystemUser> root = cq.from(SystemUser.class);
//        cq.where(cb.equal(root.get("name"), userName));
//        cq.select(root);
//        List<SystemUser> resultList = em.createQuery(cq).getResultList();
//        return ! (resultList == null || resultList.isEmpty());
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<SystemUser> root = cq.from(SystemUser.class);
        cq.where(cb.equal(root.get("name"), userName));
        cq.select(root);
        List<SystemUser> resultList = em.createQuery(cq).getResultList();
        return ! (resultList == null || resultList.isEmpty());
    }

    public int countOfUsers() {
        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        Root<SystemUser> rt = cq.from(SystemUser.class);
        cq.select(em.getCriteriaBuilder().count(rt));
        Query q = em.createQuery(cq);
        return ((Long) q.getSingleResult()).intValue();
    }

    /**
     * Попытка логина для пользователя с заданными именем и паролем.
     * В случае успеха возвращает идентификатор, иначе - null.
     * @param userName
     * @param password
     * @return
     */
    public Long tryLogOn(String userName, String password) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<SystemUser> root = cq.from(SystemUser.class);
        cq.where(cb.and(
                cb.equal(root.get("name"), userName),
                cb.equal(root.get("hashedPass"), PasswordHasher.getHashedPassword(password))));
        cq.select(root);
        List<SystemUser> resultList = em.createQuery(cq).getResultList();
        if (resultList == null || resultList.isEmpty()) {
            return null;
        }
        return resultList.get(0).getId();
    }
   
}
